﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using KandieWebProjectI.DAL.Helper;
using KandieWebProjectI.Domain.Model;

namespace KandieWebProjectI.DAL.Dal
{
    public class ProdutoDao : IDal<Produto>
    {
        private SqlConnection sConnection;
        private SqlCommand sCommand;
        private bool statusError = false;
        private IList<Produto> Produtos;
        private ConnectionHelper conHelper;
        private SqlDataReader sDataReader;

        public ProdutoDao()
        {
            this.sConnection = new SqlConnection();
            this.sCommand = new SqlCommand();
            this.Produtos = new List<Produto>();
            this.conHelper = new ConnectionHelper();
        }

        public bool Gravar(Produto entity)
        {
            StringBuilder querySql = new StringBuilder();

            conHelper.OpenConnection(sConnection);
            sCommand.Connection = sConnection;

            querySql.Append("INSERT INTO Produto ");
            querySql.Append("VALUES( @Descricao, @Preco, @Ativo )");

            sCommand.CommandText = querySql.ToString();
            sCommand.Parameters.AddWithValue("@Descricao", entity.Descricao);
            sCommand.Parameters.AddWithValue("@Preco", entity.Preco);
            sCommand.Parameters.AddWithValue("@Ativo", entity.Ativo);

            try
            {
                sCommand.ExecuteNonQuery();
            }
            catch
            {
                statusError = true;
            }

            conHelper.CloseConnection(sConnection);
            LiberarObjetos();

            return statusError;
        }

        public bool Deletar(int _id)
        {
            StringBuilder querySql = new StringBuilder();

            conHelper.OpenConnection(sConnection);
            sCommand.Connection = sConnection;

            querySql.Append("DELETE FROM Produto WHERE Id = @Id");

            sCommand.CommandText = querySql.ToString();
            sCommand.Parameters.AddWithValue("@Id", _id);

            try
            {
                sCommand.ExecuteNonQuery();
            }
            catch
            {
                statusError = true;
            }

            conHelper.CloseConnection(sConnection);
            LiberarObjetos();

            return statusError;
        }

        public bool Atualizar(Produto entity)
        {
            StringBuilder querySql = new StringBuilder();

            conHelper.OpenConnection(sConnection);
            sCommand.Connection = sConnection;

            querySql.Append("UPDATE Produto ");
            querySql.Append("SET Descricao = @Descricao, Preco = @Preco, Ativo = @Ativo ");
            querySql.Append("WHERE Id = @Id");

            sCommand.CommandText = querySql.ToString();
            sCommand.Parameters.AddWithValue("@Descricao", entity.Descricao);
            sCommand.Parameters.AddWithValue("@Preco", entity.Preco);
            sCommand.Parameters.AddWithValue("@Ativo", entity.Ativo);
            sCommand.Parameters.AddWithValue("@Id", entity.Id);

            try
            {
                sCommand.ExecuteNonQuery();
            }
            catch
            {
                statusError = false;
            }

            conHelper.CloseConnection(sConnection);
            LiberarObjetos();

            return statusError;
        }

        public IList<Produto> RetornaTodos()
        {
            StringBuilder querySql = new StringBuilder();

            conHelper.OpenConnection(sConnection);
            sCommand.Connection = sConnection;

            querySql.Append("SELECT Id, Descricao, Preco, Ativo FROM Produto ORDER BY Id");

            sCommand.CommandText = querySql.ToString();

            try
            {
                sDataReader = sCommand.ExecuteReader();

                while(sDataReader.Read())
                {
                    Produto prod = new Produto();
                    prod.Id = Int32.Parse(sDataReader["id"].ToString());
                    prod.Descricao = sDataReader["Descricao"].ToString();
                    prod.Preco = Decimal.Parse(sDataReader["Preco"].ToString());
                    prod.Ativo = Boolean.Parse(sDataReader["Ativo"].ToString());

                    Produtos.Add(prod);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro durante a leitura. Erro " + ex.Message);
            }

            conHelper.CloseConnection(sConnection);
            LiberarObjetos();

            return this.Produtos;
        }

        public Produto RetornaPorId(int _id)
        {
            StringBuilder querySql = new StringBuilder();
            Produto entity = new Produto();

            conHelper.OpenConnection(sConnection);
            sCommand.Connection = sConnection;

            querySql.Append("SELECT Id, Descricao, Preco, Ativo FROM Produto ");
            querySql.Append("WHERE Id = @Id");

            sCommand.CommandText = querySql.ToString();
            sCommand.Parameters.AddWithValue("@Id", _id);

            try
            {
                sDataReader = sCommand.ExecuteReader();

                while (sDataReader.Read())
                {

                    entity.Id = Int32.Parse(sDataReader["id"].ToString());
                    entity.Descricao = sDataReader["Descricao"].ToString();
                    entity.Preco = Decimal.Parse(sDataReader["Preco"].ToString());
                    entity.Ativo = Boolean.Parse(sDataReader["Ativo"].ToString());
                }
            }
            catch
            {
                throw new Exception("Erro durante a leitura");
            }

            conHelper.CloseConnection(sConnection);
            LiberarObjetos();

            return entity;
        }

        private void LiberarObjetos()
        {
            this.sCommand.Dispose();
            this.sConnection.Dispose();
        }
    }
}
